/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package GUI.Jogo;

import Biblioteca.VerificaErros;
import InstanciaJogo.InstanciaJogoSwing;
import java.util.ArrayList;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.JButton;
import javax.swing.JOptionPane;

/**
 *
 * @author Igor
 */
public class FramePanelIniciarJogo extends javax.swing.JPanel {

    //Atributos
    private FrameJogo frameJogo;

    /**
     * Creates new form FramePanelIniciarJogo
     */
    public FramePanelIniciarJogo(FrameJogo frameJogo) {
        initComponents();
        this.frameJogo = frameJogo;
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        buttonVoltarPanelIniciarJogoParaPanelParametros = new javax.swing.JButton();
        buttonIniciarJogo = new javax.swing.JButton();

        buttonVoltarPanelIniciarJogoParaPanelParametros.setText("Voltar");
        buttonVoltarPanelIniciarJogoParaPanelParametros.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                buttonVoltarPanelIniciarJogoParaPanelParametrosActionPerformed(evt);
            }
        });

        buttonIniciarJogo.setFont(new java.awt.Font("Tahoma", 1, 13)); // NOI18N
        buttonIniciarJogo.setText("Clique para Iniciar Jogo");
        buttonIniciarJogo.setBorderPainted(false);
        buttonIniciarJogo.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
        buttonIniciarJogo.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                buttonIniciarJogoActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER)
                    .addComponent(buttonIniciarJogo, javax.swing.GroupLayout.PREFERRED_SIZE, 294, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(buttonVoltarPanelIniciarJogoParaPanelParametros))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(buttonIniciarJogo, javax.swing.GroupLayout.PREFERRED_SIZE, 102, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(buttonVoltarPanelIniciarJogoParaPanelParametros)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
    }// </editor-fold>//GEN-END:initComponents

    private void buttonVoltarPanelIniciarJogoParaPanelParametrosActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonVoltarPanelIniciarJogoParaPanelParametrosActionPerformed
        // TODO add your handling code here:
        this.frameJogo.ativarPanelParametros();
    }//GEN-LAST:event_buttonVoltarPanelIniciarJogoParaPanelParametrosActionPerformed

    private void buttonIniciarJogoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonIniciarJogoActionPerformed
        // TODO add your handling code here:
        try {
            long idJogo;
            if (buttonIniciarJogo.isEnabled()) {
                buttonIniciarJogo.setEnabled(false);
                buttonVoltarPanelIniciarJogoParaPanelParametros.setEnabled(false);

                this.frameJogo.setPanelJogo(new FramePanelJogo(this.frameJogo));
                this.frameJogo.setJogoTemporario(new InstanciaJogoSwing(this.frameJogo.getPanelJogo().getLabelImagem(), this.frameJogo.getPanelJogo().getLabelStatus(), this.frameJogo, Long.parseLong(this.frameJogo.getPanelParametros().getRadioGroupButtonTipoJogo().getSelection().getActionCommand())));
                preencheJogoTemporario();

                //Grava instancio do jogoTemporario para ele ser pesquisado para um jogo fixo
                if (this.frameJogo.getJogoTemporario().getModoJogo() != 1) {//Se for Treinamento, não gravara nada no Banco de Dados
                    idJogo = this.frameJogo.getJogoTemporario().gravaInstanciaJogo();
                    this.frameJogo.getJogoTemporario().getJogoDAO().gravaJogo(this.frameJogo.getJogador().getIdPessoa(), idJogo);
                    this.frameJogo.setJogo(this.frameJogo.getJogoTemporario().getJogoDAO().buscaInstanciaJogo(idJogo));

                    this.frameJogo.getJogo().setPercsAvancarSubFases(this.frameJogo.getJogoTemporario().getPercsAvancarSubFases());
                    this.frameJogo.getJogo().setIdJogo(idJogo);
                    this.frameJogo.getJogo().setTelaInicial(this.frameJogo);
                    this.frameJogo.getJogo().setLabelImagem(this.frameJogo.getPanelJogo().getLabelImagem());
                    this.frameJogo.getJogo().setLabelStatus(this.frameJogo.getPanelJogo().getLabelStatus());
                    this.frameJogo.getJogo().setFase(Long.parseLong(this.frameJogo.getPanelParametros().getRadioGroupButtonTipoJogo().getSelection().getActionCommand()));
                } else {
                    this.frameJogo.getJogoTemporario().setIdJogo(-1);
                    this.frameJogo.setJogo(this.frameJogo.getJogoTemporario());
                }

                contagemRegressivaPlayGame();
            }
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, VerificaErros.retornaMensagemErro(e), "Erro!", JOptionPane.ERROR_MESSAGE);
        }
    }//GEN-LAST:event_buttonIniciarJogoActionPerformed

    public JButton getButtonIniciarJogo() {
        return buttonIniciarJogo;
    }

    public JButton getButtonVoltarPanelIniciarJogoParaPanelParametros() {
        return buttonVoltarPanelIniciarJogoParaPanelParametros;
    }

    public void Ativar() {
        this.frameJogo.ativarPanelParametros();
    }

    /**
     * Preenche os atributos da variavel jogoTemporario, pois pode-se altera-los
     * mas no final os dados vao ser transferidos para o jogo real
     */
    public void preencheJogoTemporario() {
        ArrayList<Integer> percsAvancarSubFases = new ArrayList<Integer>();
        for (int i = 0; i < this.frameJogo.getPanelParametros().getTablePercAvancarSubFases().getRowCount(); i++) {
            String str = String.valueOf(this.frameJogo.getPanelParametros().getTablePercAvancarSubFases().getValueAt(i, 1));
            Integer.parseInt(str);
            percsAvancarSubFases.add(Integer.parseInt(str));
        }

        this.frameJogo.getJogoTemporario().setTelaInicial(this.frameJogo);
        this.frameJogo.getJogoTemporario().setLabelImagem(this.frameJogo.getPanelJogo().getLabelImagem());
        this.frameJogo.getJogoTemporario().setLabelStatus(this.frameJogo.getPanelJogo().getLabelStatus());
        this.frameJogo.getJogoTemporario().setTempoApresentacaoImagens(Integer.parseInt(this.frameJogo.getPanelParametros().getTextTempoApresentacaoImagem().getText()));
        this.frameJogo.getJogoTemporario().setTempoTransicaoImagens(Integer.parseInt(this.frameJogo.getPanelParametros().getTextTempoTransicaoImagens().getText()));
        this.frameJogo.getJogoTemporario().setRepetirApresentacaoImagens(Integer.parseInt(this.frameJogo.getPanelParametros().getTextRepetirApresentacaoImagens().getText()));
        //No Baseline e no o percentual eh sempre zero
        if (this.frameJogo.getPanelParametros().getComboBoxModoJogo().getSelectedItem() != null && (this.frameJogo.getPanelParametros().getComboBoxModoJogo().getSelectedItem().equals("Baseline"))) {
            int tamanho = percsAvancarSubFases.size();
            this.frameJogo.getJogoTemporario().setPercsAvancarSubFases(new ArrayList<Integer>());
            for (int i = 0; i < tamanho; i++) {
                this.frameJogo.getJogoTemporario().getPercsAvancarSubFases().add(0);
            }
        } else {
            this.frameJogo.getJogoTemporario().setPercsAvancarSubFases(percsAvancarSubFases);
        }
        this.frameJogo.getJogoTemporario().setApresentaMensagemAcertoErro(this.frameJogo.getPanelParametros().getCheckBoxApresentarMensagemAcertoErro().isSelected());
        if (this.frameJogo.getPanelParametros().getComboBoxModoJogo().getSelectedItem().equals("Treinamento")) {
            this.frameJogo.getJogoTemporario().setModoJogo(1);
        } else if (this.frameJogo.getPanelParametros().getComboBoxModoJogo().getSelectedItem().equals("Baseline")) {
            this.frameJogo.getJogoTemporario().setModoJogo(2);
        } else if (this.frameJogo.getPanelParametros().getComboBoxModoJogo().getSelectedItem().equals("Completo")) {
            this.frameJogo.getJogoTemporario().setModoJogo(3);
        } else if (this.frameJogo.getPanelParametros().getComboBoxModoJogo().getSelectedItem().equals("Completo Progressivo")) {
            this.frameJogo.getJogoTemporario().setModoJogo(4);
        }
    }

    /**
     * Realiza a contagem regressiva para iniciar o jogo
     */
    public void contagemRegressivaPlayGame() {
        Timer timer;
        timer = new Timer();
        timer.schedule(new RemindTaskA(timer), 0, 1 * 1000);
    }

    class RemindTaskA extends TimerTask {

        private Integer segundos;
        private Timer timer;

        public RemindTaskA(Timer timer) {
            this.segundos = 5;
            this.timer = timer;
        }

        @Override
        public void run() {
            try {
                frameJogo.getPanelIniciarJogo().getButtonIniciarJogo().setText("O jogo começará em " + this.segundos + " segundos.");
                if (this.segundos == 0) {
                    frameJogo.ativarPanelJogo();
                    frameJogo.getJogo().iniciaFaseSubFase(false);

                    this.timer.cancel();
                }
                this.segundos--;
            } catch (Exception e) {
                JOptionPane.showMessageDialog(null, VerificaErros.retornaMensagemErro(e), "Erro!", JOptionPane.ERROR_MESSAGE);
            }
        }
    }


    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton buttonIniciarJogo;
    private javax.swing.JButton buttonVoltarPanelIniciarJogoParaPanelParametros;
    // End of variables declaration//GEN-END:variables
}
